home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.5)
-
- '''
- Basic infrastructure for asynchronous socket service clients and servers.
-
- There are only two ways to have a program on a single processor do "more
- than one thing at a time". Multi-threaded programming is the simplest and
- most popular way to do it, but there is another very different technique,
- that lets you have nearly all the advantages of multi-threading, without
- actually using multiple threads. it\'s really only practical if your program
- is largely I/O bound. If your program is CPU bound, then pre-emptive
- scheduled threads are probably what you really need. Network servers are
- rarely CPU-bound, however.
-
- If your operating system supports the select() system call in its I/O
- library (and nearly all do), then you can use it to juggle multiple
- communication channels at once; doing other work while your I/O is taking
- place in the "background." Although this strategy can seem strange and
- complex, especially at first, it is in many ways easier to understand and
- control than multi-threaded programming. The module documented here solves
- many of the difficult problems for you, making the task of building
- sophisticated high-performance network servers and clients a snap.
-
- NOTICE: This copy of asyncore has been modified from the Python Std Lib version.
-
- '''
- from g import *
- from codes import *
- import select
- import socket
- import sys
- import time
- import os
- import thread
- import fcntl
- from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, ENOTCONN, ESHUTDOWN, EINTR, EISCONN
- socket_map = { }
-
- class ExitNow(Exception):
- pass
-
-
- def loop(timeout = 1, sleep_time = 0.1):
- while socket_map:
- r = []
- w = []
- e = []
- for fd, obj in socket_map.items():
- if obj.readable():
- r.append(fd)
-
- if obj.writable():
- w.append(fd)
- continue
-
- if r == r and w == w:
- pass
- elif w == e:
- time.sleep(timeout)
- else:
-
- try:
- (r, w, e) = select.select(r, w, e, timeout)
- except select.error:
- []
- err = []
- if err[0] != EINTR:
- raise Error(ERROR_INTERNAL)
-
- r = []
- w = []
- e = []
- except:
- r
-
- for fd in r:
-
- try:
- obj = socket_map[fd]
- except KeyError:
- []
- []
- continue
- except:
- r
-
-
- try:
- obj.handle_read_event()
- continue
- except ExitNow:
- []
- []
- raise ExitNow
- continue
- except Error:
- e = None
- obj.handle_error(e)
- continue
-
- for fd in w:
-
- try:
- obj = socket_map[fd]
- except KeyError:
- r<EXCEPTION MATCH>ExitNow
- r<EXCEPTION MATCH>ExitNow
- []
- continue
- except:
- []
-
-
- try:
- obj.handle_write_event()
- except ExitNow:
- []
- []
- raise ExitNow
- except Error:
- e = None
- obj.handle_error(e)
- except:
- []
-
- time.sleep(sleep_time)
-
-
- continue
- []
-
-
- class dispatcher:
- connected = False
- accepting = False
- closing = False
- addr = None
-
- def __init__(self, sock = None):
- if sock:
- self.set_socket(sock)
- self.socket.setblocking(0)
- self.connected = True
-
- try:
- self.addr = sock.getpeername()
- except socket.error:
- pass
- except:
- None<EXCEPTION MATCH>socket.error
-
-
- None<EXCEPTION MATCH>socket.error
- self.socket = None
-
-
- def __repr__(self):
- status = [
- self.__class__.__module__ + '.' + self.__class__.__name__]
- if self.accepting and self.addr:
- status.append('listening')
- elif self.connected:
- status.append('connected')
-
- if self.addr is not None:
-
- try:
- status.append('%s:%d' % self.addr)
- except TypeError:
- status.append(repr(self.addr))
- except:
- None<EXCEPTION MATCH>TypeError
-
-
- None<EXCEPTION MATCH>TypeError
- return '<%s at %#x>' % (' '.join(status), id(self))
-
-
- def add_channel(self):
- socket_map[self._fileno] = self
-
-
- def del_channel(self):
- fd = self._fileno
- if socket_map.has_key(fd):
- del socket_map[fd]
-
-
-
- def create_socket(self, family, type):
- self.family_and_type = (family, type)
- self.socket = socket.socket(family, type)
- self.socket.setblocking(0)
- self._fileno = self.socket.fileno()
- self.add_channel()
-
-
- def set_socket(self, sock):
- self.socket = sock
- self._fileno = sock.fileno()
- self.add_channel()
-
-
- def set_reuse_addr(self):
-
- try:
- self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) | 1)
- except socket.error:
- pass
-
-
-
- def readable(self):
- return True
-
-
- def writable(self):
- return True
-
-
- def listen(self, num):
- self.accepting = True
- return self.socket.listen(num)
-
-
- def bind(self, addr):
- self.addr = addr
- return self.socket.bind(addr)
-
-
- def connect(self, address):
- self.connected = False
- err = self.socket.connect_ex(address)
- if err in (EINPROGRESS, EALREADY, EWOULDBLOCK):
- return None
-
- if err in (0, EISCONN):
- self.addr = address
- self.connected = True
- self.handle_connect()
- else:
- raise socket.error, err
-
-
- def accept(self):
-
- try:
- (conn, addr) = self.socket.accept()
- return (conn, addr)
- except socket.error:
- why = None
- if why[0] == EWOULDBLOCK:
- pass
- else:
- raise socket.error, why
- except:
- why[0] == EWOULDBLOCK
-
-
-
- def send(self, data):
-
- try:
- result = self.socket.send(data)
- return result
- except socket.error:
- why = None
- if why[0] == EWOULDBLOCK:
- return 0
- else:
- raise socket.error, why
- return 0
-
-
-
- def recv(self, buffer_size):
-
- try:
- data = self.socket.recv(buffer_size)
- if not data:
- self.handle_close()
- return ''
- else:
- return data
- except socket.error:
- why = None
- if why[0] in [
- ECONNRESET,
- ENOTCONN,
- ESHUTDOWN]:
- self.handle_close()
- return ''
- else:
- raise socket.error, why
- except:
- why[0] in [
- ECONNRESET,
- ENOTCONN,
- ESHUTDOWN]
-
-
-
- def close(self):
- self.del_channel()
- self.socket.close()
-
-
- def __getattr__(self, attr):
- return getattr(self.socket, attr)
-
-
- def handle_read_event(self):
- if self.accepting:
- if not self.connected:
- self.connected = True
-
- self.handle_accept()
- elif not self.connected:
- self.handle_connect()
- self.connected = True
- self.handle_read()
- else:
- self.handle_read()
-
-
- def handle_write_event(self):
- if not self.connected:
- self.handle_connect()
- self.connected = True
-
- self.handle_write()
-
-
- def handle_expt_event(self):
- self.handle_expt()
-
-
- def handle_error(self, e):
- log.error('Error processing request.')
- raise Error(ERROR_INTERNAL)
-
-
- def handle_expt(self):
- raise Error
-
-
- def handle_read(self):
- raise Error
-
-
- def handle_write(self):
- raise Error
-
-
- def handle_connect(self):
- raise Error
-
-
- def handle_accept(self):
- raise Error
-
-
- def handle_close(self):
- self.close()
-
-
-
- def close_all():
- for x in channels.values():
- x.channels.close()
-
- channels.clear()
-
-